{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 修改列名\n",
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分析location\n",
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 平均每个地区，存在的用户个数\n",
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把location变成国家\n",
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location   age\n",
       "0        1             usa   NaN\n",
       "1        2             usa  18.0\n",
       "2        3          russia   NaN\n",
       "3        4        portugal  17.0\n",
       "4        5  united kingdom   NaN"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAD4CAYAAAAZ1BptAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAbCklEQVR4nO3df5BV9Znn8feHbpofKgLaGofGATckO2qyE9KLZLLrpGREdCxxqnQLK7VSs2xRY8xusj8qwcpWqE3ibjK7M2atMs4wwgRTGdFxMiObxSEU6mZ3S9H2t0iUFjPSQaUVRIMKgs/+cZ/b93B/dEM3t/sin1fVrXvOc77nnudSTX/6fO+59yoiMDMzq2fcWDdgZmatyyFhZmYNOSTMzKwhh4SZmTXkkDAzs4bax7qB4+3MM8+MWbNmjXUbZmYnlMcff/yNiOisrn/kQmLWrFn09PSMdRtmZicUSf9Qr+7pJjMza8ghYWZmDTkkzMysIYeEmZk15JAwM7OGhgwJSWsk7Zb0XJ1t/1FSSDoz1yXpVkm9kp6RNLcwdqmk7XlbWqh/VtKzuc+tkpT16ZI25fhNkqYdn6dsZmZH62jOJH4ILKouSpoJXAq8UihfDszJ23Lg9hw7HVgJXATMA1YWfunfnmPL+5WPtQLYHBFzgM25bmZmo2jIkIiInwN76my6BfgaUPys8cXAnVHyCDBV0jnAZcCmiNgTEXuBTcCi3DYlIh6O0meW3wlcXXistbm8tlBvis3bXucHD/U28xBmZiecYb0mIekq4FcR8XTVphnAzsJ6X9YGq/fVqQOcHRGvAuT9WYP0s1xSj6Se/v7+YTwjeOiFfu74Py8Pa18zs4+qYw4JSZOBbwDfrLe5Ti2GUT8mEbEqIrojoruzs+Zd5cfyOMPe18zso2g4ZxL/CJgNPC3pl0AX8ISkj1E6E5hZGNsF7Bqi3lWnDvB6TkeR97uH0etRk4aRTmZmH3HHHBIR8WxEnBURsyJiFqVf9HMj4jVgPXB9XuU0H9iXU0UbgYWSpuUL1guBjbntHUnz86qm64H78lDrgfJVUEsL9aaod0pjZnayO5pLYO8CHgY+KalP0rJBhm8AdgC9wF8AXwKIiD3At4HH8vatrAHcANyR+7wE3J/17wKXStpO6Sqq7x7bUzt2nm0yMzvSkJ8CGxHXDbF9VmE5gBsbjFsDrKlT7wEurFN/E1gwVH/HiyS/JmFmVsXvuDYzs4YcEgU+jzAzO5JDIkk4JczMqjgkknx9k5lZDYdEgU8kzMyO5JBIkt9xbWZWzSGRPNlkZlbLIVHg8wgzsyM5JFJpummsuzAzay0OiZRfiGdmZgUOiYLwhJOZ2REcEkl4usnMrJpDosyzTWZmNRwSBT6RMDM7kkMiCX81nZlZNYdE8sVNZma1HBIFvrrJzOxIDonkq5vMzGo5JJKnm8zMag0ZEpLWSNot6blC7b9J+oWkZyT9raSphW03SeqV9IKkywr1RVnrlbSiUJ8taYuk7ZLultSR9Qm53pvbZx2vJ92ITyTMzI50NGcSPwQWVdU2ARdGxKeBF4GbACSdDywBLsh9fiCpTVIbcBtwOXA+cF2OBfgecEtEzAH2AsuyvgzYGxEfB27JcU0j5I8KNzOrMmRIRMTPgT1VtZ9FxKFcfQToyuXFwLqIOBARLwO9wLy89UbEjog4CKwDFqv0gUmXAPfm/muBqwuPtTaX7wUWqIkfsOTpJjOzWsfjNYl/BdyfyzOAnYVtfVlrVD8DeKsQOOX6EY+V2/fl+BqSlkvqkdTT398/7Cfi8wgzsyONKCQkfQM4BPy4XKozLIZRH+yxaosRqyKiOyK6Ozs7B2+6AV/dZGZWq324O0paClwJLIjKZH4fMLMwrAvYlcv16m8AUyW159lCcXz5sfoktQOnUzXtZWZmzTWsMwlJi4CvA1dFxLuFTeuBJXll0mxgDvAo8BgwJ69k6qD04vb6DJcHgWty/6XAfYXHWprL1wAPRDNfWfaLEmZmNYY8k5B0F/AF4ExJfcBKSlczTQA25WvJj0TEH0XEVkn3AM9Tmoa6MSIO5+N8GdgItAFrImJrHuLrwDpJ3wGeBFZnfTXwI0m9lM4glhyH59v4eTbzwc3MTlBDhkREXFenvLpOrTz+ZuDmOvUNwIY69R2Urn6qrr8PXDtUf8dbRPhb6szMkt9xncq54BevzcwqHBJJnnAyM6vhkKjiEwkzswqHRKpMNzkmzMzKHBLJk01mZrUcElV8HmFmVuGQSL66ycyslkMi+b0RZma1HBJV/D3XZmYVDokqnm4yM6twSCTPNpmZ1XJImJlZQw6JVP5YDk83mZlVOCSSp5vMzGo5JKr46iYzswqHRCqfSHi6ycyswiGRPN1kZlbLIVHFJxJmZhUOiVS5uskxYWZWNmRISFojabek5wq16ZI2Sdqe99OyLkm3SuqV9IykuYV9lub47ZKWFuqflfRs7nOr8kOUGh2jWTzdZGZW62jOJH4ILKqqrQA2R8QcYHOuA1wOzMnbcuB2KP3CB1YCFwHzgJWFX/q359jyfouGOEZT+TzCzKxiyJCIiJ8De6rKi4G1ubwWuLpQvzNKHgGmSjoHuAzYFBF7ImIvsAlYlNumRMTDUZrnubPqseodo6k822RmVjHc1yTOjohXAfL+rKzPAHYWxvVlbbB6X536YMeoIWm5pB5JPf39/cN6Qv6ocDOzWsf7het6v2ljGPVjEhGrIqI7Iro7OzuPdfcRHt3M7KNruCHxek4Vkfe7s94HzCyM6wJ2DVHvqlMf7BhNMfBmOqeEmdmA4YbEeqB8hdJS4L5C/fq8ymk+sC+nijYCCyVNyxesFwIbc9s7kubnVU3XVz1WvWM0hWebzMxqtQ81QNJdwBeAMyX1UbpK6bvAPZKWAa8A1+bwDcAVQC/wLvCHABGxR9K3gcdy3Lciovxi+A2UrqCaBNyfNwY5RlP5hWszs4ohQyIirmuwaUGdsQHc2OBx1gBr6tR7gAvr1N+sd4xm8YmEmVktv+O6ik8kzMwqHBKpfAmsP5bDzKzCIZH8wrWZWS2HRBWfR5iZVTgkkr90yMyslkOizPNNZmY1HBJV/I5rM7MKh0QaOI9wRpiZDXBIJM82mZnVckhU8YmEmVmFQyJVvuN6jBsxM2shDonk6SYzs1oOiSq+usnMrMIhkfxmOjOzWg6J5OkmM7NaDokqPpEwM6twSKTK1U2OCTOzModEmaebzMxqOCSq+ETCzKzCIZF8ImFmVmtEISHp30naKuk5SXdJmihptqQtkrZLultSR46dkOu9uX1W4XFuyvoLki4r1BdlrVfSipH0ehTPpZkPb2Z2Qhp2SEiaAfxboDsiLgTagCXA94BbImIOsBdYlrssA/ZGxMeBW3Icks7P/S4AFgE/kNQmqQ24DbgcOB+4Lsc2laebzMwqRjrd1A5MktQOTAZeBS4B7s3ta4Grc3lxrpPbF6j05/tiYF1EHIiIl4FeYF7eeiNiR0QcBNbl2KYYeDOdL4I1Mxsw7JCIiF8B/x14hVI47AMeB96KiEM5rA+YkcszgJ2576Ecf0axXrVPo3oNScsl9Ujq6e/vH9bz8WyTmVmtkUw3TaP0l/1s4DeAUyhNDVUr/2le79dwDKNeW4xYFRHdEdHd2dk5VOuD8nSTmVnFSKabfg94OSL6I+ID4CfA7wBTc/oJoAvYlct9wEyA3H46sKdYr9qnUb0pymcSzggzs4qRhMQrwHxJk/O1hQXA88CDwDU5ZilwXy6vz3Vy+wNRenvzemBJXv00G5gDPAo8BszJq6U6KL24vX4E/Q5KvgjWzKxG+9BD6ouILZLuBZ4ADgFPAquA/wWsk/SdrK3OXVYDP5LUS+kMYkk+zlZJ91AKmEPAjRFxGEDSl4GNlK6cWhMRW4fb7zE8r2YfwszshDHskACIiJXAyqryDkpXJlWPfR+4tsHj3AzcXKe+Adgwkh6PlqebzMxq+R3XZmbWkEOiimebzMwqHBLJH8thZlbLIVHDpxJmZmUOieTvuDYzq+WQSJ5tMjOr5ZCo4hMJM7MKh0SqfMf1GDdiZtZCHBLJ001mZrUcElX8fRJmZhUOieSrm8zMajkkkqebzMxqOSSq+EzCzKzCITEgr27yaxJmZgMcEsnTTWZmtRwSVTzdZGZW4ZBIPpEwM6vlkEj+qHAzs1oOiSqebjIzqxhRSEiaKuleSb+QtE3S5yRNl7RJ0va8n5ZjJelWSb2SnpE0t/A4S3P8dklLC/XPSno297lVTfxzf+DNdL66ycxswEjPJP4H8PcR8Y+BfwJsA1YAmyNiDrA51wEuB+bkbTlwO4Ck6cBK4CJgHrCyHCw5Znlhv0Uj7LchzzaZmdUadkhImgJcDKwGiIiDEfEWsBhYm8PWAlfn8mLgzih5BJgq6RzgMmBTROyJiL3AJmBRbpsSEQ9HRAB3Fh6raTzdZGZWMZIzifOAfuAvJT0p6Q5JpwBnR8SrAHl/Vo6fAews7N+XtcHqfXXqNSQtl9Qjqae/v39YT6Z8JuGMMDOrGElItANzgdsj4jPAfipTS/XUm9CJYdRrixGrIqI7Iro7OzsH77phc55vMjOrNpKQ6AP6ImJLrt9LKTRez6ki8n53YfzMwv5dwK4h6l116k0Vnm8yMxsw7JCIiNeAnZI+maUFwPPAeqB8hdJS4L5cXg9cn1c5zQf25XTURmChpGn5gvVCYGNue0fS/Lyq6frCYx1/nm4yM6vRPsL9/w3wY0kdwA7gDykFzz2SlgGvANfm2A3AFUAv8G6OJSL2SPo28FiO+1ZE7MnlG4AfApOA+/PWFJ5sMjOrNaKQiIingO46mxbUGRvAjQ0eZw2wpk69B7hwJD0eK882mZlV+B3XqfI+PaeEmVmZQyJ5usnMrJZDooqnm8zMKhwSyR/LYWZWyyFRxScSZmYVDolUfse1p5vMzCocEsnTTWZmtRwSVfyxHGZmFQ6J5HdJmJnVckiUebrJzKyGQ6KKZ5vMzCocEmng6iZPOJmZDXBIJF/dZGZWyyFRzScSZmYDHBLJVzeZmdVySCR5vsnMrIZDooqvbjIzq3BIJA18x7VTwsyszCGRPNlkZlZrxCEhqU3Sk5J+muuzJW2RtF3S3ZI6sj4h13tz+6zCY9yU9RckXVaoL8par6QVI+31aHi6ycys4nicSXwF2FZY/x5wS0TMAfYCy7K+DNgbER8HbslxSDofWAJcACwCfpDB0wbcBlwOnA9cl2ObojLdZGZmZSMKCUldwO8Dd+S6gEuAe3PIWuDqXF6c6+T2BTl+MbAuIg5ExMtALzAvb70RsSMiDgLrcmyTeMLJzKzaSM8kvg98Dfgw188A3oqIQ7neB8zI5RnAToDcvi/HD9Sr9mlUryFpuaQeST39/f0jekL+qHAzs4phh4SkK4HdEfF4sVxnaAyx7VjrtcWIVRHRHRHdnZ2dg3TdmKebzMxqtY9g388DV0m6ApgITKF0ZjFVUnueLXQBu3J8HzAT6JPUDpwO7CnUy4r7NKofd55sMjOrNewziYi4KSK6ImIWpReeH4iILwIPAtfksKXAfbm8PtfJ7Q9EaW5nPbAkr36aDcwBHgUeA+bk1VIdeYz1w+336J9Y049gZnbCGMmZRCNfB9ZJ+g7wJLA666uBH0nqpXQGsQQgIrZKugd4HjgE3BgRhwEkfRnYCLQBayJiaxP6JY8F+M10ZmZFxyUkIuIh4KFc3kHpyqTqMe8D1zbY/2bg5jr1DcCG49HjUDzdZGZWy++4ruKLm8zMKhwSaeDqJoeEmdkAh0SSJ5zMzGo4JKr4RMLMrMIhkSrTTY4JM7Myh4SZmTXkkKji8wgzswqHRPJXXJuZ1XJIVPFLEmZmFQ6JVLkE1ilhZlbmkEiebjIzq+WQqOLpJjOzCodE8pcOmZnVckgkfyyHmVkth0QVTzeZmVU4JFJluskpYWZW5pBInmwyM6vlkKji6SYzswqHRPLVTWZmtYYdEpJmSnpQ0jZJWyV9JevTJW2StD3vp2Vdkm6V1CvpGUlzC4+1NMdvl7S0UP+spGdzn1ulZr7lzRNOZmbVRnImcQj4DxHxW8B84EZJ5wMrgM0RMQfYnOsAlwNz8rYcuB1KoQKsBC4C5gEry8GSY5YX9ls0gn4H1dFW+qc48MHhZh3CzOyEM+yQiIhXI+KJXH4H2AbMABYDa3PYWuDqXF4M3BkljwBTJZ0DXAZsiog9EbEX2AQsym1TIuLhKH0T0J2FxzruOk+bAED/rw806xBmZiec4/KahKRZwGeALcDZEfEqlIIEOCuHzQB2Fnbry9pg9b469aaY1NHGaRPa2f22Q8LMrGzEISHpVOBvgK9GxNuDDa1Ti2HU6/WwXFKPpJ7+/v6hWm6oc8oE+t9xSJiZlY0oJCSNpxQQP46In2T59ZwqIu93Z70PmFnYvQvYNUS9q069RkSsiojuiOju7Owc9vM5+7SJvLrvvWHvb2b2UTOSq5sErAa2RcSfFjatB8pXKC0F7ivUr8+rnOYD+3I6aiOwUNK0fMF6IbAxt70jaX4e6/rCYzXFJ84+lRdee4cPP/SFsGZmMLIzic8D/xK4RNJTebsC+C5wqaTtwKW5DrAB2AH0An8BfAkgIvYA3wYey9u3sgZwA3BH7vMScP8I+h3Sp7qmsv/gYXa8sb+ZhzEzO2G0D3fHiPi/NH5zwYI64wO4scFjrQHW1Kn3ABcOt8djNXPaJABe2/c+Hz/r1NE6rJlZy/I7rgumn9IBwJ53D45xJ2ZmrcEhUTAtQ2LvfoeEmRk4JI4wddJ4APb6TMLMDHBIHKG9bRynTxrvMwkzs+SQqHL2lAns3Ov3SpiZgUOixqe7pvLUzrcIf7GEmZlDoto/n3Mme/Yf5GfPvz7WrZiZjTmHRJUrP/0btI8Tz/S9NdatmJmNOYdElbZxYnJHG/sP+HslzMwcEnVM7mjnvYMOCTMzh0Qdkye0sf/gobFuw8xszDkk6pjc0ca7PpMwM3NI1DO5o513fSZhZuaQqOcUn0mYmQEOibpKZxIOCTMzh0QdkzvaePeAp5vMzBwSdZw+aTxv7j/IwUMfjnUrZmZjyiFRR/es6Rw49CF//r9f4tBhB4WZnbwcEnVc/IkzmXvuVP5k04t8c/3WsW7HzGzMOCTqmNzRzl//0e/wqRmn8z+f2sWBQ34R28xOTi0fEpIWSXpBUq+kFaN13LZx4l/805m8c+AQv/vHD/Ff79/G3z/3Grvfed8fI25mJ432sW5gMJLagNuAS4E+4DFJ6yPi+dE4/hfnncvZp03grx59hVU/30E5GyaOH8esM07h9z91DmefPpEpE8czuaONyR1tTBzfxqTy/fg2Jo4fxzgpn08+L6rXQeUxeeyBbeUFM7Mx0NIhAcwDeiNiB4CkdcBiYFRCYtw4sfCCj7Hwgo/x9vsf8NQrb/FS/6/51d732Pj8a/zJphdHo40jHFWwUBhUtb1eQFHnsah3nCH2UWHn2rFH9tbosY7YdhT71Ou3+vHMThb/5Q8+xbzZ04/rY7Z6SMwAdhbW+4CLqgdJWg4sBzj33HOb0siUieO5+BOdXPyJTgD+05Xn8+7BQ7z564O8/f4HvHfwMPsPHub9Dyq39w4e5v1DH/JhBNUzVOUpqwiIgVreE1XrRw6IoxhbvZ0jjnN0+xR7jsKxh+q1sl/VtqPYp9jvkcerPX6jbRT6NjuZnDKh7bg/ZquHRL0/B2t+BUTEKmAVQHd396j9ipjc0c7k6a3+T2hmNnyt/sJ1HzCzsN4F7BqjXszMTjqtHhKPAXMkzZbUASwB1o9xT2ZmJ42WniuJiEOSvgxsBNqANRHhd7eZmY2Slg4JgIjYAGwY6z7MzE5GrT7dZGZmY8ghYWZmDTkkzMysIYeEmZk1pI/ah9VJ6gf+YZi7nwm8cRzbaSb32hzutTnca3Mcz15/MyI6q4sfuZAYCUk9EdE91n0cDffaHO61Odxrc4xGr55uMjOzhhwSZmbWkEPiSKvGuoFj4F6bw702h3ttjqb36tckzMysIZ9JmJlZQw4JMzNryCGRJC2S9IKkXkkrWqCfNZJ2S3quUJsuaZOk7Xk/LeuSdGv2/oykuaPY50xJD0raJmmrpK+0cK8TJT0q6ens9T9nfbakLdnr3fmx9EiakOu9uX3WaPVa6LlN0pOSftrKvUr6paRnJT0lqSdrLfczkMefKuleSb/In9vPtWKvkj6Z/57l29uSvjrqvUbESX+j9DHkLwHnAR3A08D5Y9zTxcBc4LlC7Y+BFbm8AvheLl8B3E/pm/zmA1tGsc9zgLm5fBrwInB+i/Yq4NRcHg9syR7uAZZk/c+AG3L5S8Cf5fIS4O4x+Dn498BfAT/N9ZbsFfglcGZVreV+BvL4a4F/ncsdwNRW7bXQcxvwGvCbo93rqD/ZVrwBnwM2FtZvAm5qgb5mVYXEC8A5uXwO8EIu/zlwXb1xY9DzfcClrd4rMBl4gtJ3pr8BtFf/LFD6HpPP5XJ7jtMo9tgFbAYuAX6a//lbtdd6IdFyPwPAFODl6n+bVuy1qr+FwP8bi1493VQyA9hZWO/LWqs5OyJeBcj7s7LeEv3nFMdnKP2F3pK95vTNU8BuYBOlM8i3IuJQnX4Ges3t+4AzRqtX4PvA14APc/0MWrfXAH4m6XFJy7PWij8D5wH9wF/mNN4dkk5p0V6LlgB35fKo9uqQKFGd2ol0bfCY9y/pVOBvgK9GxNuDDa1TG7VeI+JwRPw2pb/S5wG/NUg/Y9arpCuB3RHxeLE8SD9j/TPw+YiYC1wO3Cjp4kHGjmWv7ZSmcW+PiM8A+ylN2TQy1v+u5OtOVwF/PdTQOrUR9+qQKOkDZhbWu4BdY9TLYF6XdA5A3u/O+pj2L2k8pYD4cUT8pJV7LYuIt4CHKM3dTpVU/pbGYj8Dveb204E9o9Ti54GrJP0SWEdpyun7LdorEbEr73cDf0spgFvxZ6AP6IuILbl+L6XQaMVeyy4HnoiI13N9VHt1SJQ8BszJK0c6KJ3arR/jnupZDyzN5aWU5v/L9evz6ob5wL7y6WizSRKwGtgWEX/a4r12Spqay5OA3wO2AQ8C1zTotfwcrgEeiJzsbbaIuCkiuiJiFqWfxwci4out2KukUySdVl6mNH/+HC34MxARrwE7JX0ySwuA51ux14LrqEw1lXsavV5H+wWYVr1RujLgRUpz1N9ogX7uAl4FPqD0F8IySnPMm4HteT89xwq4LXt/FugexT7/GaVT2meAp/J2RYv2+mngyez1OeCbWT8PeBTopXRKPyHrE3O9N7efN0Y/C1+gcnVTy/WaPT2dt63l/z+t+DOQx/9toCd/Dv4OmNbCvU4G3gROL9RGtVd/LIeZmTXk6SYzM2vIIWFmZg05JMzMrCGHhJmZNeSQMDOzhhwSZmbWkEPCzMwa+v/marPw9m1Q9wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(location_value_counts)),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 分析年龄\n",
    "df_user[df_user.age.isnull()].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[df_user.age.isnull()].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user_age_not_null = df_user[~df_user.age.isnull()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_not_null.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age = df_user_age_not_null.age.value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x204a1c2d8d0>]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分析年龄段\n",
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149780 non-null int64\n",
      "item_id    1149780 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除有误数据\n",
    "df_rating = df_rating.dropna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 用户活跃度\n",
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 商品流行度分析\n",
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      "user_id    1149772 non-null int64\n",
      "item_id    1149772 non-null object\n",
      "rating     1149772 non-null int32\n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 打分分析\n",
    "rating_value_counts = df_rating['rating'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(rating_value_counts)),\n",
    "    rating_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int64\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 48.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data.age = df_data.age.astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     1149772 non-null int64\n",
      "location    1149772 non-null object\n",
      "age         1149772 non-null int32\n",
      "item_id     1149772 non-null object\n",
      "rating      1149772 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "df_data = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(123)\n",
    "test_index_s = random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data) * 0.3)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>225863</th>\n",
       "      <td>54813</td>\n",
       "      <td>spain</td>\n",
       "      <td>3</td>\n",
       "      <td>8495501236</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80014</th>\n",
       "      <td>19842</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0446603392</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>795081</th>\n",
       "      <td>195694</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0446529508</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1124497</th>\n",
       "      <td>272314</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0373834748</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>696669</th>\n",
       "      <td>171235</td>\n",
       "      <td>germany</td>\n",
       "      <td>3</td>\n",
       "      <td>3453171500</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>714705</th>\n",
       "      <td>175003</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0316601950</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108845</th>\n",
       "      <td>27091</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0553211668</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>334836</th>\n",
       "      <td>82123</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0898623774</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>283236</th>\n",
       "      <td>69697</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0373483287</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>707194</th>\n",
       "      <td>173632</td>\n",
       "      <td>austria</td>\n",
       "      <td>3</td>\n",
       "      <td>349960681X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>700021</th>\n",
       "      <td>172030</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>1551668718</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>514144</th>\n",
       "      <td>126911</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0345335465</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>343464</th>\n",
       "      <td>84908</td>\n",
       "      <td>germany</td>\n",
       "      <td>3</td>\n",
       "      <td>3404145356</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3503</th>\n",
       "      <td>1519</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0671028375</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>914936</th>\n",
       "      <td>225078</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0393324761</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>183738</th>\n",
       "      <td>43021</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>006017918X</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>791873</th>\n",
       "      <td>194646</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>4</td>\n",
       "      <td>0563551860</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146542</th>\n",
       "      <td>35857</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0060929995</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13830</th>\n",
       "      <td>5350</td>\n",
       "      <td>germany</td>\n",
       "      <td>3</td>\n",
       "      <td>3453127013</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>661565</th>\n",
       "      <td>163307</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0399149848</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>940198</th>\n",
       "      <td>230030</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0684815176</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>213986</th>\n",
       "      <td>52203</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>2253141488</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92038</th>\n",
       "      <td>23768</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0375506039</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>194541</th>\n",
       "      <td>46398</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0896938239</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>298162</th>\n",
       "      <td>73420</td>\n",
       "      <td>germany</td>\n",
       "      <td>4</td>\n",
       "      <td>3932902114</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>597388</th>\n",
       "      <td>146517</td>\n",
       "      <td>turkey</td>\n",
       "      <td>3</td>\n",
       "      <td>0743211375</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>233020</th>\n",
       "      <td>55858</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0440237688</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>246958</th>\n",
       "      <td>59206</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "      <td>0375703861</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>286829</th>\n",
       "      <td>70065</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>1857932471</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>125843</th>\n",
       "      <td>30898</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>1558745033</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>701883</th>\n",
       "      <td>172636</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>1551664348</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1006722</th>\n",
       "      <td>243548</td>\n",
       "      <td>germany</td>\n",
       "      <td>3</td>\n",
       "      <td>3442447380</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>927519</th>\n",
       "      <td>227276</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>3</td>\n",
       "      <td>0747564132</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>734861</th>\n",
       "      <td>179978</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>068981125X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>217339</th>\n",
       "      <td>52584</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0877018103</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>688968</th>\n",
       "      <td>170229</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>093941693X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>537720</th>\n",
       "      <td>131366</td>\n",
       "      <td>japan</td>\n",
       "      <td>3</td>\n",
       "      <td>0006511414</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>605902</th>\n",
       "      <td>148744</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0786862653</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565154</th>\n",
       "      <td>138253</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0439116759</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>992138</th>\n",
       "      <td>240403</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0141311118</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>428968</th>\n",
       "      <td>104880</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0785702849</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>231972</th>\n",
       "      <td>55548</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0802132758</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>368663</th>\n",
       "      <td>91203</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>3</td>\n",
       "      <td>0749316047</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22960</th>\n",
       "      <td>7352</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0743456394</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>179027</th>\n",
       "      <td>41455</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0804111898</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1128357</th>\n",
       "      <td>273979</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0671541013</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1019737</th>\n",
       "      <td>246069</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0375706771</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>621991</th>\n",
       "      <td>153621</td>\n",
       "      <td>spain</td>\n",
       "      <td>3</td>\n",
       "      <td>0192832247</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>210763</th>\n",
       "      <td>51682</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0789716615</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1007999</th>\n",
       "      <td>243929</td>\n",
       "      <td></td>\n",
       "      <td>4</td>\n",
       "      <td>0446676128</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1064716</th>\n",
       "      <td>257025</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>044022859X</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>427486</th>\n",
       "      <td>104636</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0425127583</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1022650</th>\n",
       "      <td>246655</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0373706235</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22450</th>\n",
       "      <td>7346</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0449219399</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>473426</th>\n",
       "      <td>115003</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0316780375</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>344931 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         user_id        location  age     item_id  rating\n",
       "109814     27462             usa    0  1587492695       0\n",
       "561359    137190          france    3  0552997234       8\n",
       "182843     42721          canada    3  0671024108       8\n",
       "854047    208829          canada    0  0140503897       0\n",
       "559003    136348             usa    4  0807220299       9\n",
       "225863     54813           spain    3  8495501236       5\n",
       "80014      19842             usa    0  0446603392       0\n",
       "795081    195694             usa    3  0446529508       0\n",
       "1124497   272314          canada    3  0373834748       0\n",
       "696669    171235         germany    3  3453171500       8\n",
       "714705    175003             usa    3  0316601950       0\n",
       "108845     27091             usa    3  0553211668       0\n",
       "334836     82123             usa    3  0898623774       0\n",
       "283236     69697             usa    3  0373483287       8\n",
       "707194    173632         austria    3  349960681X       0\n",
       "700021    172030             usa    3  1551668718       0\n",
       "514144    126911             usa    4  0345335465       0\n",
       "343464     84908         germany    3  3404145356       0\n",
       "3503        1519             usa    4  0671028375       8\n",
       "914936    225078             usa    4  0393324761       0\n",
       "183738     43021             usa    0  006017918X       5\n",
       "791873    194646  united kingdom    4  0563551860       8\n",
       "146542     35857             usa    3  0060929995       0\n",
       "13830       5350         germany    3  3453127013       7\n",
       "661565    163307             usa    3  0399149848       0\n",
       "940198    230030             usa    3  0684815176       0\n",
       "213986     52203          france    3  2253141488       0\n",
       "92038      23768             usa    3  0375506039       0\n",
       "194541     46398             usa    3  0896938239       8\n",
       "298162     73420         germany    4  3932902114      10\n",
       "...          ...             ...  ...         ...     ...\n",
       "597388    146517          turkey    3  0743211375       0\n",
       "233020     55858          canada    3  0440237688       0\n",
       "246958     59206  united kingdom    0  0375703861       8\n",
       "286829     70065          canada    3  1857932471       0\n",
       "125843     30898             usa    3  1558745033       0\n",
       "701883    172636             usa    3  1551664348       7\n",
       "1006722   243548         germany    3  3442447380       5\n",
       "927519    227276  united kingdom    3  0747564132       0\n",
       "734861    179978             usa    3  068981125X       0\n",
       "217339     52584             usa    3  0877018103       5\n",
       "688968    170229             usa    4  093941693X       0\n",
       "537720    131366           japan    3  0006511414       5\n",
       "605902    148744             usa    4  0786862653       0\n",
       "565154    138253          canada    0  0439116759       9\n",
       "992138    240403             usa    4  0141311118       7\n",
       "428968    104880             usa    3  0785702849       0\n",
       "231972     55548             usa    0  0802132758       0\n",
       "368663     91203  united kingdom    3  0749316047       0\n",
       "22960       7352             usa    4  0743456394       2\n",
       "179027     41455          canada    0  0804111898       0\n",
       "1128357   273979             usa    3  0671541013       0\n",
       "1019737   246069             usa    4  0375706771       9\n",
       "621991    153621           spain    3  0192832247       0\n",
       "210763     51682          canada    0  0789716615       0\n",
       "1007999   243929                    4  0446676128       0\n",
       "1064716   257025             usa    3  044022859X       9\n",
       "427486    104636             usa    0  0425127583       0\n",
       "1022650   246655             usa    0  0373706235       0\n",
       "22450       7346             usa    4  0449219399       0\n",
       "473426    115003             usa    3  0316780375       0\n",
       "\n",
       "[344931 rows x 5 columns]"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_test = df_data.loc[test_index_s]\n",
    "df_data_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      "user_id     344931 non-null int64\n",
      "location    344931 non-null object\n",
      "age         344931 non-null int32\n",
      "item_id     344931 non-null object\n",
      "rating      344931 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 13.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = df_data[\n",
    "    ~df_data.index.isin(test_index_s)\n",
    "]\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 804841 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     804841 non-null int64\n",
      "location    804841 non-null object\n",
      "age         804841 non-null int32\n",
      "item_id     804841 non-null object\n",
      "rating      804841 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存数据\n",
    "cPickle.dump(\n",
    "    df_data_test, open('./data/df_data_test.pkl','wb')\n",
    ")\n",
    "\n",
    "cPickle.dump(\n",
    "    df_data_training, open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入训练集\n",
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 804841 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     804841 non-null int64\n",
      "location    804841 non-null object\n",
      "age         804841 non-null int32\n",
      "item_id     804841 non-null object\n",
      "rating      804841 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " '',\n",
       " 'australia',\n",
       " 'spain',\n",
       " 'france',\n",
       " 'n/a',\n",
       " 'italy',\n",
       " 'portugal']"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()[:11].index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "top10_location = ['usa',\n",
    " 'canada',\n",
    " 'united kingdom',\n",
    " 'germany',\n",
    " 'australia',\n",
    " 'spain',\n",
    " 'france',\n",
    " 'n/a',\n",
    " 'italy',\n",
    " 'portugal']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data_training['location'] = df_data_training['location'].apply(lambda location : location if location in top10_location else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               537641\n",
       "canada             72451\n",
       "other              60023\n",
       "united kingdom     35354\n",
       "germany            27687\n",
       "australia          18604\n",
       "spain              17949\n",
       "france              9735\n",
       "n/a                 9541\n",
       "italy               8482\n",
       "portugal            7374\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training.location.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\n推荐字典\\nfeature_recommand = {\\n    'usa':{\\n        '0':[item1,item2,item3],\\n        '1':[item1,item2,item3]\\n    },\\n    'canada':{\\n        '0':[item1,item2,item3],\\n        '1':[item1,item2,item3]\\n    },\\n}\\n带评分推荐字典\\nfeature_recommand_with_rating = {\\n    'usa':{\\n        '0':[{item1:10.0},{item2:9.7},item3],\\n        '1':[item1,item2,item3]\\n    },\\n    'canada':{\\n        '0':[item1,item2,item3],\\n        '1':[item1,item2,item3]\\n    },\\n}\\n\\n\""
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\n",
    "推荐字典\n",
    "feature_recommand = {\n",
    "    'usa':{\n",
    "        '0':[item1,item2,item3],\n",
    "        '1':[item1,item2,item3]\n",
    "    },\n",
    "    'canada':{\n",
    "        '0':[item1,item2,item3],\n",
    "        '1':[item1,item2,item3]\n",
    "    },\n",
    "}\n",
    "带评分推荐字典\n",
    "feature_recommand_with_rating = {\n",
    "    'usa':{\n",
    "        '0':[{item1:10.0},{item2:9.7},item3],\n",
    "        '1':[item1,item2,item3]\n",
    "    },\n",
    "    'canada':{\n",
    "        '0':[item1,item2,item3],\n",
    "        '1':[item1,item2,item3]\n",
    "    },\n",
    "}\n",
    "\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_recommand = defaultdict(dict)\n",
    "feature_recommand_with_rating = defaultdict(dict)\n",
    "\n",
    "for location, groupby_location in df_data_training.groupby('location'):\n",
    "    for age, groupby_location_age in groupby_location.groupby('age'):\n",
    "        item_id_value_counts = groupby_location_age['item_id'].value_counts()\n",
    "        divide_boundary = max(5, np.percentile(item_id_value_counts, 75))\n",
    "        groupby_location_age_top = groupby_location_age[\n",
    "            groupby_location_age['item_id'].isin(\n",
    "            item_id_value_counts[item_id_value_counts >= divide_boundary].index\n",
    "        )]\n",
    "        item_mean_rating = groupby_location_age_top.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20]\n",
    "        \n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            {\"%s\" % item_id : round(item_mean_rating[item_id], 2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519', '1857022424'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4: ['0091867770'],\n",
       "              5: []},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2: [],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641'],\n",
       "              5: []},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5: []},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667', '0439064872', '059035342X'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['0971880107',\n",
       " '0316666343',\n",
       " '0385504209',\n",
       " '0312195516',\n",
       " '0060928336',\n",
       " '0679781587',\n",
       " '044023722X',\n",
       " '0142001740',\n",
       " '0316601950',\n",
       " '0671027360',\n",
       " '0446672211',\n",
       " '067976402X',\n",
       " '0375727345',\n",
       " '059035342X',\n",
       " '0440214041',\n",
       " '0452282152',\n",
       " '044021145X',\n",
       " '0440211727',\n",
       " '0345337662',\n",
       " '0804106304',\n",
       " '0440226430',\n",
       " '0156027321',\n",
       " '0060976845',\n",
       " '0060930535',\n",
       " '0345370775',\n",
       " '0440241073',\n",
       " '0671003755',\n",
       " '0743418174',\n",
       " '0671021001',\n",
       " '0312278586',\n",
       " '0446605239',\n",
       " '0786868716',\n",
       " '1400034779',\n",
       " '0440222656',\n",
       " '0440234743',\n",
       " '0345361792',\n",
       " '0440221471',\n",
       " '0440236673',\n",
       " '0316769487',\n",
       " '0385484518',\n",
       " '044022165X',\n",
       " '0345353145',\n",
       " '0345417623',\n",
       " '0440206154',\n",
       " '0446310786',\n",
       " '0375706771',\n",
       " '0446606812',\n",
       " '0060502258',\n",
       " '0446610038',\n",
       " '044651652X',\n",
       " '0440220602',\n",
       " '0440225701',\n",
       " '0439064872',\n",
       " '0671510053',\n",
       " '0345443284',\n",
       " '0440213525',\n",
       " '0140293248',\n",
       " '0060934417',\n",
       " '0385335482',\n",
       " '0452282829',\n",
       " '006101351X',\n",
       " '0375726403',\n",
       " '0375707972',\n",
       " '0440224764',\n",
       " '0316284955',\n",
       " '043935806X',\n",
       " '0316776963',\n",
       " '0312291639',\n",
       " '0385492081',\n",
       " '0385720106',\n",
       " '0345342968',\n",
       " '0385265700',\n",
       " '0684872153',\n",
       " '0375700757',\n",
       " '0380789035',\n",
       " '0060938455',\n",
       " '0375725784',\n",
       " '0553572997',\n",
       " '068484477X',\n",
       " '0842329129',\n",
       " '0316096199',\n",
       " '0385722206',\n",
       " '0061009059',\n",
       " '0312305060',\n",
       " '0060987103',\n",
       " '0440224675',\n",
       " '0553279912',\n",
       " '0345378490',\n",
       " '0671001795',\n",
       " '0142000205',\n",
       " '0446364193',\n",
       " '0345351525',\n",
       " '0684874350',\n",
       " '0345339681',\n",
       " '0060392452',\n",
       " '0446608955',\n",
       " '0316569321',\n",
       " '0743237188',\n",
       " '0446611867',\n",
       " '0446612545',\n",
       " '0345313860',\n",
       " '0440235596',\n",
       " '0515131229',\n",
       " '014028009X',\n",
       " '0805063897',\n",
       " '0449212602',\n",
       " '0380731851',\n",
       " '0345339703',\n",
       " '0553268880',\n",
       " '0671027387',\n",
       " '0345391055',\n",
       " '1558743669',\n",
       " '0440226104',\n",
       " '051513287X',\n",
       " '0679746048',\n",
       " '080410753X',\n",
       " '0345387651',\n",
       " '0380730138',\n",
       " '0446611212',\n",
       " '0679429220',\n",
       " '0804114986',\n",
       " '0345380371',\n",
       " '0385486804',\n",
       " '0380002930',\n",
       " '0060915544',\n",
       " '0425175405',\n",
       " '0060959037',\n",
       " '0399501487',\n",
       " '0064407667',\n",
       " '0786881852',\n",
       " '0446607657',\n",
       " '0446605484',\n",
       " '0440241537',\n",
       " '0312983271',\n",
       " '0553582755',\n",
       " '0345384466',\n",
       " '080410526X',\n",
       " '0312924585',\n",
       " '034540288X',\n",
       " '0553280341',\n",
       " '0451166892',\n",
       " '0060987529',\n",
       " '0380789019',\n",
       " '0312966091',\n",
       " '0425167313',\n",
       " '014025448X',\n",
       " '0439136369',\n",
       " '0140298479',\n",
       " '0449005615',\n",
       " '0062502182',\n",
       " '0140244824',\n",
       " '0679745203',\n",
       " '0425152251',\n",
       " '074343627X',\n",
       " '0425147622',\n",
       " '0060987561',\n",
       " '080411109X',\n",
       " '0425180638',\n",
       " '0380018179',\n",
       " '0446601241',\n",
       " '0440211263',\n",
       " '0070212570',\n",
       " '0425154092',\n",
       " '068484267X',\n",
       " '0446612790',\n",
       " '0060977493',\n",
       " '0449003795',\n",
       " '0671041789',\n",
       " '0515132020',\n",
       " '0743225406',\n",
       " '038079487X',\n",
       " '080411868X',\n",
       " '0061097101',\n",
       " '0385508042',\n",
       " '1573229326',\n",
       " '0312966970',\n",
       " '0385505833',\n",
       " '0871136791',\n",
       " '0425158616',\n",
       " '0671038184',\n",
       " '0345402871',\n",
       " '0312971346',\n",
       " '0767902521',\n",
       " '0312995423',\n",
       " '0609804138',\n",
       " '155874262X',\n",
       " '0451524934',\n",
       " '0553250426',\n",
       " '0812550706',\n",
       " '0385479565',\n",
       " '0425162443',\n",
       " '0345439104',\n",
       " '067102423X',\n",
       " '0385335881',\n",
       " '1400031354',\n",
       " '0440236703',\n",
       " '0141000198',\n",
       " '0446359866',\n",
       " '0449907481',\n",
       " '0312980140',\n",
       " '0425182908',\n",
       " '0440212561',\n",
       " '0380718340',\n",
       " '0671042858',\n",
       " '0767905180',\n",
       " '0375703055',\n",
       " '0425169863',\n",
       " '038550120X',\n",
       " '0316781266',\n",
       " '0553260111',\n",
       " '0385503822',\n",
       " '0553580221',\n",
       " '0380718332',\n",
       " '014023313X',\n",
       " '1559029838',\n",
       " '0451183665',\n",
       " '0316899984',\n",
       " '0066214122',\n",
       " '014029628X',\n",
       " '0312282990',\n",
       " '0671024248',\n",
       " '0743436210',\n",
       " '0553579606',\n",
       " '0439139600',\n",
       " '0375702709',\n",
       " '0439139597',\n",
       " '0451184963',\n",
       " '0441569595',\n",
       " '034538475X',\n",
       " '0671004530',\n",
       " '0345438329',\n",
       " '1573225789',\n",
       " '0446532231',\n",
       " '0671014196',\n",
       " '0553279378',\n",
       " '0446670251',\n",
       " '0439136350',\n",
       " '042511774X',\n",
       " '0553277472',\n",
       " '0515132187',\n",
       " '0446610399',\n",
       " '044651862X',\n",
       " '0140067477',\n",
       " '0590353403',\n",
       " '038572179X',\n",
       " '0451203771',\n",
       " '042516098X',\n",
       " '0671867156',\n",
       " '0316780375',\n",
       " '0425163407',\n",
       " '0375703861',\n",
       " '0399144463',\n",
       " '0446604801',\n",
       " '0142001430',\n",
       " '0312976275',\n",
       " '0452264464',\n",
       " '0440180295',\n",
       " '0515126772',\n",
       " '034541389X',\n",
       " '0345339738',\n",
       " '0553280368',\n",
       " '0060175400',\n",
       " '0553275976',\n",
       " '0345465083',\n",
       " '0671758896',\n",
       " '0449221504',\n",
       " '0345350499',\n",
       " '0140119906',\n",
       " '0449003787',\n",
       " '0446606189',\n",
       " '0316969443',\n",
       " '0440224624',\n",
       " '0767900383',\n",
       " '0345348036',\n",
       " '0515128554',\n",
       " '0553272535',\n",
       " '0345413903',\n",
       " '0385498802',\n",
       " '0842329218',\n",
       " '055356451X',\n",
       " '0671004573',\n",
       " '0446607711',\n",
       " '002542730X',\n",
       " '0142001805',\n",
       " '0515130389',\n",
       " '0345339711',\n",
       " '0385336179',\n",
       " '0425147584',\n",
       " '0061015725',\n",
       " '0441003257',\n",
       " '0446516538',\n",
       " '0425116840',\n",
       " '0451156609',\n",
       " '0099771519',\n",
       " '0684801523',\n",
       " '0060391626',\n",
       " '0440235162',\n",
       " '0446608815',\n",
       " '140003065X',\n",
       " '0553375407',\n",
       " '0684848783',\n",
       " '0060921145',\n",
       " '0439064864',\n",
       " '0553279556',\n",
       " '0743227441',\n",
       " '0385721420',\n",
       " '0446394521',\n",
       " '0451167317',\n",
       " '0312421273',\n",
       " '031298328X',\n",
       " '0804111359',\n",
       " '0440219078',\n",
       " '0553271636',\n",
       " '042510107X',\n",
       " '0425083837',\n",
       " '0553579754',\n",
       " '0345413350',\n",
       " '0451526341',\n",
       " '0553582747',\n",
       " '0449221512',\n",
       " '067088300X',\n",
       " '0425143325',\n",
       " '0312980159',\n",
       " '0385474016',\n",
       " '0449219364',\n",
       " '0553574574',\n",
       " '0553284789',\n",
       " '0425133540',\n",
       " '0749397543',\n",
       " '0440498058',\n",
       " '0525947647',\n",
       " '0446610100',\n",
       " '0451203895',\n",
       " '0441172717',\n",
       " '0553582526',\n",
       " '006016848X',\n",
       " '0312243022',\n",
       " '0151008116',\n",
       " '0312983867',\n",
       " '0380813815',\n",
       " '044022103X',\n",
       " '0375703063',\n",
       " '0671727796',\n",
       " '0671617028',\n",
       " '0451172817',\n",
       " '0553578693',\n",
       " '0553582135',\n",
       " '0440414806',\n",
       " '0385720955',\n",
       " '014100018X',\n",
       " '0375705856',\n",
       " '0316969680',\n",
       " '0385497466',\n",
       " '0449221482',\n",
       " '0449223612',\n",
       " '0671004107',\n",
       " '0786817070',\n",
       " '1558745157',\n",
       " '0446606324',\n",
       " '0440223202',\n",
       " '0345378482',\n",
       " '0425115801',\n",
       " '0449223604',\n",
       " '0440998050',\n",
       " '031242227X',\n",
       " '0446679593',\n",
       " '0375502238',\n",
       " '037570504X',\n",
       " '0446604666',\n",
       " '0671011367',\n",
       " '0812511816',\n",
       " '0515128546',\n",
       " '0425109720',\n",
       " '0446360589',\n",
       " '0743412028',\n",
       " '0449221490',\n",
       " '0451177096',\n",
       " '0553296981',\n",
       " '0449219461',\n",
       " '038550926X',\n",
       " '0446611808',\n",
       " '0553273914',\n",
       " '0316089699',\n",
       " '0425172546',\n",
       " '0060958022',\n",
       " '0061097314',\n",
       " '0671888587',\n",
       " '0671028375',\n",
       " '0671793489',\n",
       " '0440221595',\n",
       " '0553571885',\n",
       " '0425144429',\n",
       " '051513628X',\n",
       " '0553289411',\n",
       " '0670865796',\n",
       " '0425182878',\n",
       " '042513525X',\n",
       " '0767905385',\n",
       " '0385511612',\n",
       " '0679744398',\n",
       " '0440224594',\n",
       " '0345368754',\n",
       " '038082101X',\n",
       " '0425147363',\n",
       " '0446531332',\n",
       " '0553250531',\n",
       " '0345427637',\n",
       " '0345447840',\n",
       " '0671004565',\n",
       " '0451202341',\n",
       " '0679751521',\n",
       " '0553292722',\n",
       " '038549081X',\n",
       " '1558744150',\n",
       " '0671042262',\n",
       " '0399150897',\n",
       " '0446603589',\n",
       " '0312990456',\n",
       " '0345391802',\n",
       " '089480829X',\n",
       " '0373218397',\n",
       " '0440213290',\n",
       " '0786885688',\n",
       " '0380710218',\n",
       " '0345370805',\n",
       " '0671894455',\n",
       " '0671004549',\n",
       " '0312422156',\n",
       " '0679731148',\n",
       " '0452283205',\n",
       " '0679735909',\n",
       " '0156628708',\n",
       " '0446364800',\n",
       " '0312265867',\n",
       " '0446609404',\n",
       " '0446611085',\n",
       " '0452260116',\n",
       " '0671673688',\n",
       " '0743418204',\n",
       " '0671867113',\n",
       " '0743411250',\n",
       " '055321313X',\n",
       " '0345384369',\n",
       " '0425122123',\n",
       " '0743206045',\n",
       " '0670892963',\n",
       " '0515121843',\n",
       " '0451160525',\n",
       " '0375506039',\n",
       " '0440202043',\n",
       " '0312983824',\n",
       " '0553582127',\n",
       " '0671708635',\n",
       " '0345435168',\n",
       " '0743460529',\n",
       " '0375727132',\n",
       " '0425180964',\n",
       " '0452269571',\n",
       " '0671867172',\n",
       " '0385420161',\n",
       " '0553564528',\n",
       " '0802130208',\n",
       " '0842342702',\n",
       " '0345446860',\n",
       " '0786867647',\n",
       " '1878424319',\n",
       " '0670894184',\n",
       " '0670880728',\n",
       " '0441790348',\n",
       " '0446603716',\n",
       " '039592720X',\n",
       " '0316789089',\n",
       " '0345369947',\n",
       " '0553573136',\n",
       " '0743224574',\n",
       " '0671568175',\n",
       " '0553561618',\n",
       " '0399147195',\n",
       " '0373218192',\n",
       " '0451186362',\n",
       " '0330332775',\n",
       " '1558744630',\n",
       " '0425124347',\n",
       " '055356160X',\n",
       " '0553569910',\n",
       " '0385424728',\n",
       " '0743467523',\n",
       " '0446611778',\n",
       " '0060173289',\n",
       " '0385730586',\n",
       " '038533334X',\n",
       " '051512608X',\n",
       " '0452284449',\n",
       " '0515135062',\n",
       " '0374129983',\n",
       " '0425170349',\n",
       " '0345386108',\n",
       " '0440215625',\n",
       " '0671042572',\n",
       " '0345424719',\n",
       " '0446608890',\n",
       " '0452280621',\n",
       " '0553581554',\n",
       " '0375760911',\n",
       " '0385502532',\n",
       " '0380730847',\n",
       " '0449227421',\n",
       " '0451176464',\n",
       " '0394820371',\n",
       " '0679444815',\n",
       " '0743211383',\n",
       " '0552124753',\n",
       " '0060929871',\n",
       " '0449006522',\n",
       " '0451181379',\n",
       " '0425107469',\n",
       " '0064407675',\n",
       " '0515127833',\n",
       " '0140177396',\n",
       " '0373218036',\n",
       " '0064472272',\n",
       " '0679772677',\n",
       " '0380012863',\n",
       " '0375412824',\n",
       " '0802139256',\n",
       " '0515136530',\n",
       " '0060922532',\n",
       " '0446520802',\n",
       " '0553582143',\n",
       " '0316781010',\n",
       " '0743437640',\n",
       " '0316666009',\n",
       " '0842329242',\n",
       " '0451169530',\n",
       " '0060199652',\n",
       " '0316788228',\n",
       " '0385472951',\n",
       " '0743211375',\n",
       " '038529929X',\n",
       " '0425178765',\n",
       " '0380717018',\n",
       " '0385490992',\n",
       " '0316693006',\n",
       " '0345413881',\n",
       " '1400031362',\n",
       " '0446675059',\n",
       " '0553578022',\n",
       " '0345384350',\n",
       " '0553580191',\n",
       " '038542471X',\n",
       " '0440218535',\n",
       " '0345413873',\n",
       " '0446607193',\n",
       " '0064400557',\n",
       " '0446610542',\n",
       " '0312265859',\n",
       " '0446613266',\n",
       " '0515133973',\n",
       " '006019491X',\n",
       " '0515122734',\n",
       " '0451204530',\n",
       " '0399149325',\n",
       " '0671867091',\n",
       " '0679734775',\n",
       " '0345436911',\n",
       " '0425184226',\n",
       " '0316782505',\n",
       " '042513699X',\n",
       " '0679446486',\n",
       " '0425158632',\n",
       " '0553569155',\n",
       " '0684865742',\n",
       " '0316602906',\n",
       " '0399146431',\n",
       " '0316693200',\n",
       " '0671693816',\n",
       " '0451207521',\n",
       " '0385493800',\n",
       " '0380977788',\n",
       " '0452282195',\n",
       " '0316693235',\n",
       " '0385510438',\n",
       " '0316168688',\n",
       " '0399149155',\n",
       " '0060096195',\n",
       " '0451205421',\n",
       " '0515133302',\n",
       " '0140254544',\n",
       " '0743457358',\n",
       " '0425155404',\n",
       " '0440122090',\n",
       " '0316777730',\n",
       " '1592400876',\n",
       " '0345444884',\n",
       " '0688177751',\n",
       " '0553282476',\n",
       " '0399145087',\n",
       " '034536676X',\n",
       " '0804115761',\n",
       " '0743203631',\n",
       " '038542017X',\n",
       " '0446609323',\n",
       " '0451163966',\n",
       " '0515136379',\n",
       " '034538184X',\n",
       " '0425132951',\n",
       " '0316781142',\n",
       " '0425153975',\n",
       " '0449134482',\n",
       " '080213825X',\n",
       " '0091867770',\n",
       " '0553274295',\n",
       " '0451206525',\n",
       " '0373484224',\n",
       " '0553560247',\n",
       " '0684867621',\n",
       " '0552998486',\n",
       " '0767915054',\n",
       " '0671880314',\n",
       " '0446519138',\n",
       " '1573225517',\n",
       " '0142004235',\n",
       " '0375706410',\n",
       " '0060932759',\n",
       " '0446605409',\n",
       " '0380820293',\n",
       " '0553213148',\n",
       " '0399146253',\n",
       " '0446365505',\n",
       " '0671683993',\n",
       " '0312144075',\n",
       " '034543479X',\n",
       " '034539657X',\n",
       " '0451169522',\n",
       " '006099486X',\n",
       " '0425174271',\n",
       " '0345354613',\n",
       " '0316182540',\n",
       " '0425192733',\n",
       " '0316777722',\n",
       " '0553572326',\n",
       " '0345422317',\n",
       " '0375500510',\n",
       " '1573229571',\n",
       " '0312971125',\n",
       " '0060008032',\n",
       " '080411935X',\n",
       " '0425136981',\n",
       " '0330375253',\n",
       " '0553576801',\n",
       " '0671727583',\n",
       " '0345404114',\n",
       " '0425092917',\n",
       " '0425177173',\n",
       " '0373825013',\n",
       " '0515130966',\n",
       " '0609610597',\n",
       " '042518630X',\n",
       " '0451208765',\n",
       " '0451153553',\n",
       " '0156006529',\n",
       " '0380727501',\n",
       " '0684833395',\n",
       " '0679442790',\n",
       " '1576737330',\n",
       " '0312306326',\n",
       " '051511992X',\n",
       " '0374199698',\n",
       " '0061020710',\n",
       " '067101420X',\n",
       " '0515124214',\n",
       " '1551668998',\n",
       " '0425192725',\n",
       " '067976397X',\n",
       " '0451180232',\n",
       " '0140179836',\n",
       " '0385512104',\n",
       " '0671027662',\n",
       " '0446606383',\n",
       " '0060916508',\n",
       " '0385335830',\n",
       " '0804105820',\n",
       " '0440200989',\n",
       " '0449912558',\n",
       " '1573227331',\n",
       " '0373218400',\n",
       " '0446603929',\n",
       " '0842329250',\n",
       " '0440241162',\n",
       " '0553569058',\n",
       " '0553580930',\n",
       " '0446525502',\n",
       " '0446602620',\n",
       " '0553265741',\n",
       " '0316602051',\n",
       " '0345445848',\n",
       " '0451170385',\n",
       " '0451197747',\n",
       " '0060512822',\n",
       " '0345348109',\n",
       " '0446667900',\n",
       " '0553274503',\n",
       " '0679735771',\n",
       " '0425151867',\n",
       " '0553571818',\n",
       " '0345441036',\n",
       " '0743437802',\n",
       " '0373484003',\n",
       " '0688177859',\n",
       " '051512317X',\n",
       " '0671011375',\n",
       " '0553583441',\n",
       " '0446363251',\n",
       " '0385424736',\n",
       " '0446670111',\n",
       " '1400031346',\n",
       " '0425185710',\n",
       " '0312982518',\n",
       " '0894805770',\n",
       " '0671027581',\n",
       " '0446530522',\n",
       " '0425147517',\n",
       " '0553280414',\n",
       " '076790592X',\n",
       " '043936213X',\n",
       " '0887307876',\n",
       " '0743206029',\n",
       " '0345314255',\n",
       " '0385475721',\n",
       " '0312244266',\n",
       " '0452268060',\n",
       " '0449910237',\n",
       " '0312274920',\n",
       " '042517736X',\n",
       " '0515120618',\n",
       " '0451188454',\n",
       " '0425150143',\n",
       " '0446525537',\n",
       " '044661064X',\n",
       " '0425178102',\n",
       " '0380814021',\n",
       " '080411918X',\n",
       " '0345413865',\n",
       " '0345422384',\n",
       " '0804108749',\n",
       " '0451191145',\n",
       " '034538430X',\n",
       " '0345416260',\n",
       " '0380817691',\n",
       " '0451188462',\n",
       " '0385503954',\n",
       " '0345366239',\n",
       " '0345397819',\n",
       " '0316678104',\n",
       " '0425178579',\n",
       " '0671741195',\n",
       " '0440217490',\n",
       " '0425119653',\n",
       " '0345354621',\n",
       " '0671027344',\n",
       " '0380710722',\n",
       " '0786866586',\n",
       " '081297106X',\n",
       " '0451209907',\n",
       " '0425166619',\n",
       " '0743235150',\n",
       " '0671537458',\n",
       " '0671014919',\n",
       " '0449203794',\n",
       " '0140042598',\n",
       " '0425142485',\n",
       " '1558745718',\n",
       " '0345413369',\n",
       " '0446604844',\n",
       " '0385720920',\n",
       " '0446350982',\n",
       " '0425189864',\n",
       " '0375504397',\n",
       " '0312924801',\n",
       " '0385508417',\n",
       " '0374100128',\n",
       " '0312966806',\n",
       " '1400032717',\n",
       " '0425121631',\n",
       " '0451169514',\n",
       " '0425145638',\n",
       " '0786889020',\n",
       " '0515135739',\n",
       " '0671038443',\n",
       " '0425161242',\n",
       " '0452281903',\n",
       " '0743439740',\n",
       " '0671525743',\n",
       " '0316693251',\n",
       " '0671701231',\n",
       " '0440225825',\n",
       " '067169507X',\n",
       " '0446365386',\n",
       " '0684862719',\n",
       " '0679723161',\n",
       " '0316693286',\n",
       " '0060926317',\n",
       " '0553295977',\n",
       " '0312986343',\n",
       " '0425172996',\n",
       " '0425140032',\n",
       " '055357230X',\n",
       " '0671026011',\n",
       " '0140092323',\n",
       " '0316603287',\n",
       " '0375413634',\n",
       " '0375412530',\n",
       " '0446605581',\n",
       " '0425130711',\n",
       " '0679731725',\n",
       " '0425179613',\n",
       " '0671743058',\n",
       " '0553584510',\n",
       " '0451186923',\n",
       " '042510687X',\n",
       " '0099387913',\n",
       " '0425157539',\n",
       " '0553263226',\n",
       " '0553258001',\n",
       " '0312978383',\n",
       " '0449911519',\n",
       " '0525946829',\n",
       " '0425167720',\n",
       " '0446604232',\n",
       " '0312263120',\n",
       " '0440217563',\n",
       " '0743418131',\n",
       " '0670030643',\n",
       " '0440940001',\n",
       " '0446527785',\n",
       " '1573229725',\n",
       " '015100692X',\n",
       " '0451142934',\n",
       " '034540761X',\n",
       " '0671886665',\n",
       " '0312983298',\n",
       " '044661193X',\n",
       " '0385503857',\n",
       " '0312974256',\n",
       " '0671028367',\n",
       " '0345404769',\n",
       " '0553582763',\n",
       " '0805059555',\n",
       " '006092988X',\n",
       " '0446604275',\n",
       " '0446356832',\n",
       " '0425181103',\n",
       " '0446608262',\n",
       " '0425179885',\n",
       " '0446523569',\n",
       " '1558531025',\n",
       " '0373243286',\n",
       " '0767916069',\n",
       " '0345392825',\n",
       " '000649840X',\n",
       " '0671670689',\n",
       " '0312201656',\n",
       " '042518286X',\n",
       " '0553582658',\n",
       " '0425189031',\n",
       " '0312952716',\n",
       " '0679457526',\n",
       " '1565122968',\n",
       " '0156028778',\n",
       " '067697175X',\n",
       " '0373484232',\n",
       " '0451166582',\n",
       " '0679439382',\n",
       " '0060740450',\n",
       " '0553572210',\n",
       " '0425151875',\n",
       " '0671034022',\n",
       " '0812570944',\n",
       " '0671024094',\n",
       " '0425121259',\n",
       " '0553583468',\n",
       " '067100042X',\n",
       " '0670894605',\n",
       " '0440211891',\n",
       " '0671250671',\n",
       " '0440236738',\n",
       " '0553212583',\n",
       " '0440204194',\n",
       " '0553210092',\n",
       " '0515087122',\n",
       " '0446673544',\n",
       " '0805019375',\n",
       " '0373244487',\n",
       " '0028604199',\n",
       " '0689817851',\n",
       " '0345386132',\n",
       " '0679720200',\n",
       " '0553213172',\n",
       " '0451163524',\n",
       " '0440201926',\n",
       " '0553211404',\n",
       " '0553578316',\n",
       " '0156007479',\n",
       " '0425118703',\n",
       " '0060964049',\n",
       " '0375705198',\n",
       " '0451151259',\n",
       " '0345447867',\n",
       " '006109921X',\n",
       " '0345384377',\n",
       " '0553278029',\n",
       " '0743469801',\n",
       " '0743417682',\n",
       " '0671023616',\n",
       " '0812543262',\n",
       " '0440221315',\n",
       " '0441005489',\n",
       " '0553573403',\n",
       " '0767905202',\n",
       " '0440236053',\n",
       " '0316693324',\n",
       " '0385490445',\n",
       " '0786862564',\n",
       " '0380703882',\n",
       " '0590660543',\n",
       " '0060930187',\n",
       " '0316690619',\n",
       " '0440224705',\n",
       " '0425152898',\n",
       " '0385509456',\n",
       " '0671028383',\n",
       " '0805062971',\n",
       " '0553208845',\n",
       " '0061098795',\n",
       " '0064471047',\n",
       " '0385494246',\n",
       " '0671776134',\n",
       " '0375703764',\n",
       " '0330262130',\n",
       " '0553586122',\n",
       " '0345452569',\n",
       " '0446607207',\n",
       " '0425162788',\n",
       " '0446353205',\n",
       " '0345396936',\n",
       " '0446604402',\n",
       " '0385315236',\n",
       " '0684857820',\n",
       " '0446611476',\n",
       " '0380600129',\n",
       " '0679742298',\n",
       " '0451190491',\n",
       " '0373484410',\n",
       " '0446530077',\n",
       " '0515118656',\n",
       " '0440207622',\n",
       " '0060188731',\n",
       " '0786890436',\n",
       " '0671729411',\n",
       " '155166674X',\n",
       " '0425169693',\n",
       " '0440176484',\n",
       " '0061000175',\n",
       " '0345441133',\n",
       " '0425161722',\n",
       " '0671741187',\n",
       " '0446527165',\n",
       " '0375414053',\n",
       " '0552137030',\n",
       " '0373484429',\n",
       " '0553578308',\n",
       " '0399143947',\n",
       " '0142002267',\n",
       " '0345389964',\n",
       " '055356773X',\n",
       " '0451191013',\n",
       " '8873122933',\n",
       " '0679419462',\n",
       " '1857022424',\n",
       " '0451203593',\n",
       " '0385482388',\n",
       " '0385314698',\n",
       " '0373483694',\n",
       " '0553579983',\n",
       " '0440220424',\n",
       " '044900371X',\n",
       " '0451155750',\n",
       " '0446609943',\n",
       " '0330367358',\n",
       " '0099245027',\n",
       " '0439404371',\n",
       " '0671002481',\n",
       " '0061031992',\n",
       " '0446613843',\n",
       " '0515132136',\n",
       " '0805036504',\n",
       " '0553562614',\n",
       " '0446601640',\n",
       " '0553583980',\n",
       " '0552996181',\n",
       " ...]"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 找到热门商品\n",
    "top2000_item_id_s = df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "top2000_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0440234743</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0452264464</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>14</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0971880107</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345402871</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345417623</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id location  age     item_id  rating\n",
       "20        9      usa    0  0440234743       0\n",
       "21        9      usa    0  0452264464       6\n",
       "29       14      usa    0  0971880107       0\n",
       "30       16      usa    0  0345402871       9\n",
       "31       16      usa    0  0345417623       0"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "df_data_training_top2000.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 159956 entries, 20 to 1149771\n",
      "Data columns (total 5 columns):\n",
      "user_id     159956 non-null int64\n",
      "location    159956 non-null object\n",
      "age         159956 non-null int32\n",
      "item_id     159956 non-null object\n",
      "rating      159956 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 6.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_training_top2000.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1844262553',\n",
       " '0439139597',\n",
       " '0439136350',\n",
       " '0439064864',\n",
       " '0877017883',\n",
       " '0618002227',\n",
       " '0590353403',\n",
       " '0671027344',\n",
       " '0385199570',\n",
       " '0771060548',\n",
       " '0156528207',\n",
       " '0618129022',\n",
       " '0552128481',\n",
       " '0552131059',\n",
       " '0811801802',\n",
       " '0670032379',\n",
       " '0812550706',\n",
       " '0679785892',\n",
       " '0670894605',\n",
       " '0811825558']"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "top20_item_id_s = df_data_training_top2000.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20].index.tolist()\n",
    "top20_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "        feature_recommand_len = len(feature_recommand[location][age])\n",
    "        feature_recommand[location][age] += top20_item_id_s[:20-feature_recommand_len]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'n/a': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892']}})"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'n/a': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892']}})"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入测试集\n",
    "df_data_test = cPickle.load(open('./data/df_data_test.pkl','rb'))\n",
    "df_data_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      "user_id     344931 non-null int64\n",
      "location    344931 non-null object\n",
      "age         344931 non-null int32\n",
      "item_id     344931 non-null object\n",
      "rating      344931 non-null int32\n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 13.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 得到准确率和召回率\n",
    "union_quantity = 0\n",
    "recommand_quantity = 0\n",
    "user_fav_quantity = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理location\n",
    "top_location_s = list(feature_recommand.keys())\n",
    "df_data_test['location'] = df_data_test['location'].apply(lambda location : location if location in top_location_s else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               230427\n",
       "canada             31331\n",
       "other              25235\n",
       "united kingdom     15239\n",
       "germany            11986\n",
       "australia           7873\n",
       "spain               7792\n",
       "france              4142\n",
       "n/a                 4097\n",
       "italy               3665\n",
       "portugal            3144\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_test['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "执行到： australia 0\n",
      "执行到： australia 1\n",
      "执行到： australia 2\n",
      "执行到： australia 3\n",
      "执行到： australia 4\n",
      "执行到： australia 5\n",
      "执行到： canada 0\n",
      "执行到： canada 1\n",
      "执行到： canada 2\n",
      "执行到： canada 3\n",
      "执行到： canada 4\n",
      "执行到： canada 5\n",
      "执行到： france 0\n",
      "执行到： france 2\n",
      "执行到： france 3\n",
      "执行到： france 4\n",
      "执行到： france 5\n",
      "执行到： germany 0\n",
      "执行到： germany 1\n",
      "执行到： germany 2\n",
      "执行到： germany 3\n",
      "执行到： germany 4\n",
      "执行到： germany 5\n",
      "执行到： italy 0\n",
      "执行到： italy 2\n",
      "执行到： italy 3\n",
      "执行到： italy 4\n",
      "执行到： n/a 0\n",
      "执行到： other 0\n",
      "执行到： other 1\n",
      "执行到： other 2\n",
      "执行到： other 3\n",
      "执行到： other 4\n",
      "执行到： other 5\n",
      "执行到： portugal 0\n",
      "执行到： portugal 2\n",
      "执行到： portugal 3\n",
      "执行到： portugal 4\n",
      "执行到： portugal 5\n",
      "执行到： spain 0\n",
      "执行到： spain 2\n",
      "执行到： spain 3\n",
      "执行到： spain 4\n",
      "执行到： spain 5\n",
      "执行到： united kingdom 0\n",
      "执行到： united kingdom 1\n",
      "执行到： united kingdom 2\n",
      "执行到： united kingdom 3\n",
      "执行到： united kingdom 4\n",
      "执行到： united kingdom 5\n",
      "执行到： usa 0\n",
      "执行到： usa 1\n",
      "执行到： usa 2\n",
      "执行到： usa 3\n",
      "执行到： usa 4\n",
      "执行到： usa 5\n",
      "准确率: 0.0003806202422469719\n",
      "召回率: 0.0032610965638002216\n"
     ]
    }
   ],
   "source": [
    "for location,groupby_location in df_data_test.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        print('执行到：',location,age)\n",
    "        for user_id,groupby_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = groupby_location_age_userid.groupby('item_id')['rating'].mean().sort_values(ascending=False)\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            recommand_items = feature_recommand[location][age]\n",
    "            union_quantity += len(\n",
    "                set(user_fav_items) & set(recommand_items)\n",
    "            )\n",
    "            recommand_quantity += len(recommand_items)\n",
    "            user_fav_quantity += len(user_fav_items)\n",
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
